1、input子系统
	input 子系统用于管理各种输入设备，如按键、键盘、鼠标等。input 子系统分为3层：输入设备驱动层、核心层、输入
事件处理层，驱动层用于驱动设备，核心层承上起下为驱动层提供管理设备和上报事件的接口，事件层主要负责和用户空间
进行交互。在开发输入设备驱动时我们只需要关心 input 子系统的输入设备驱动层，对于核心层和输入事件处理层在内核中
已经实现。
2、 struct input_dev 对象
	input_dev 对象表示一个input设备，它的核心成员如下：
	struct input_dev {
		//输入设备的名字，对应/sys/devices/virtual/input/inputx/中name文件中的内容，此外目录中的eventx文件夹
		//对应于/dev/input/目录中的输入设备文件名。
		const char *name;
 
		//输入设备支持的事件类型位图
		unsigned long evbit[BITS_TO_LONGS(EV_CNT)];

		//相应事件可以上报的事件码位图
		//按键事件
		unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];
		//相对坐标事件
		unsigned long relbit[BITS_TO_LONGS(REL_CNT)];
		//绝对准备事件
		unsigned long absbit[BITS_TO_LONGS(ABS_CNT)];
		//其他事件
		unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];
		//led事件
		unsigned long ledbit[BITS_TO_LONGS(LED_CNT)];
		//声音事件
		unsigned long sndbit[BITS_TO_LONGS(SND_CNT)];
		//压力反馈事件
		unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];
		//压力状态事件
		unsigned long swbit[BITS_TO_LONGS(SW_CNT)];
	};
	事件码和事件类型定义参考 input_event_codes.h 文件，可以通过 void __set_bit (int nr, volatile void *addr)
分别设置事件码位图和事件类型位图中的某一位，也可以使用 void input_set_capability(struct input_dev *dev, 
unsigned int type, unsigned int code) 函数完成事件码位图和事件类型位图的设置。
	当设备支持重复事件后内核会为其开启一个定时器生成重复事件，无需设备驱动层重复上报。
3、注册和注销输入设备
	注册输入设备：
		1）分配输入设备； struct input_dev *input_allocate_device(void)
		2）初始化 input_dev 对象，主要是支持的事件类型和对应的事件码
		3）注册输入设备； int input_register_device(struct input_dev *dev)
	注销输入设备：
		1）注销输入设备； void input_unregister_device(struct input_dev *dev)
		2）释放输入设备； void input_free_device(struct input_dev *dev)
4、上报输入事件
	通过函数 input_event 可以上报输入设备产生的输入事件：
		/**
		 * dev 需要上报的 input_dev。
		 * type 上报的事件类型，比如 EV_KEY。
		 * code 事件码，如 KEY_0、 KEY_1 等等。
		 * value 事件值，如 1 表示按键按下， 0 表示按键松开。
		 */
		void input_event(struct input_dev *dev,unsigned int type,unsigned int code,int value)
	另外针对相应类型的事件采用专门的事件上报函数进行上报，这些函数都是对 input_event 函数进行了二次封装，如 
input_report_key 可用于上报按键事件。
5、事件同步
	上报完成后需要调用 input_sync 告诉内核此次上报结束：
		/**
		* 需要上报同步事件的 input_dev。
		*/
		void input_sync(struct input_dev *dev)

